package base.thread_example.example08;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 优化 demo08_03/InterruptMonitorTool2.java
 *
 * 终止模式之两阶段终止模式：在一个线程t1中如何优雅的终止线程t2，优雅是说给t2一个料理后事的机会
 * 模拟监控工具记录应用日志。
 * 提供手动关闭工具记录日志功能。
 */
public class InterruptMonitorTool {
    private static final Logger log = LoggerFactory.getLogger(InterruptMonitorTool.class);

    public static void main(String[] args) throws InterruptedException {
        MonitorTools tool = new InterruptMonitorTool().new MonitorTools();

        log.info("启动.....");
        // 启动日志监控
        tool.start();

        // 模拟日常监控中
        Thread.sleep(5000);

        // 模拟手动关闭日志监控
        tool.stop();
    }


    class MonitorTools {
        private final Logger log = LoggerFactory.getLogger(MonitorTools.class);

        private Thread monitor ;
        private volatile boolean stop = false;
        private boolean starting = false;

        // 启动监控线程
        public void start(){
            synchronized (this){//防止启动多次监控系统
                if(starting){
                    return;
                }
                starting = true;
            }
            monitor = new Thread(()->{
                while (true){
                    if(stop){
                        log.info("功能：结束收尾工作...");
                        break;// 退出 while循环
                    }
                    try {
                        Thread.sleep(2000);// 监控每隔2s监控一次日志
                        log.info("功能：调用执行监控记录日志功能....");
                    } catch (Exception e) {
                        log.info("被打断异常...");
                    }
                }
            });
            monitor.start();
        }

        // 停止监控线程
        public void stop(){
            stop = true;
            monitor.interrupt();//确保Thread.sleep(2000)过程中打断立马进行收尾工作，而不要再等待休眠完成(假如实际应用中休眠间隔时间很长,就不用再等待了)。
        }

    }

}
